package auth

import (
	mgo "gopkg.in/mgo.v2"
	"gopkg.in/mgo.v2/bson"
)

const (
	DBName       = "auth_db"
	UserCollName = "user_collection"
)

type MgoStore struct {
	session *mgo.Session
}

func NewMgoStore(url string) (*MgoStore, error) {
	session, err := mgo.Dial("localhost")
	session.SetMode(mgo.Monotonic, true)
	return &MgoStore{
		session: session,
	}, err
}

func (store *MgoStore) Close() {
	store.session.Close()
}

func (store *MgoStore) doDB(fn func(*mgo.Collection) error) error {
	sess := store.session.Clone()
	defer sess.Close()
	return fn(sess.DB(DBName).C(UserCollName))
}

func (store *MgoStore) CreateUser(u User) (User, error) {
	return u, store.doDB(func(uc *mgo.Collection) error {
		u.ID = bson.NewObjectId().Hex()

		return uc.Insert(u)
	})
}

func (store *MgoStore) Authenticate(u User) (User, error) {
	return u, store.doDB(func(uc *mgo.Collection) error {
		return uc.Find(bson.M{"name": u.Name, "password": u.Password}).One(&u)
	})
}

func (store *MgoStore) GetUserById(id string) (User, error) {
	var u User
	return u, store.doDB(func(uc *mgo.Collection) error {
		return uc.FindId(id).One(&u)
	})
}
